/**
 * 用户相关API服务
 */
import request from './config.js';
import { setStorage } from '../utils/storage.js';

/**
 * 用户登录
 * @param {Object} data - 登录信息
 * @param {string} data.username - 用户名或邮箱
 * @param {string} data.password - 密码
 * @returns {Promise} 登录结果
 */
export function login(data) {
  // OpenAPI: POST /login  body: AppLoginBody  resp: RMapObject
  return request('/login', {
    method: 'POST',
    data
  });
}

/**
 * 用户注册
 * @param {Object} data - 注册信息
 * @param {string} data.username - 用户名
 * @param {string} data.email - 邮箱
 * @param {string} data.password - 密码
 * @returns {Promise} 注册结果
 */
export function register(data) {
  // OpenAPI: POST /register  body: AppRegisterBody
  return request('/register', {
    method: 'POST',
    data
  });
}

/**
 * 忘记密码
 * @param {Object} data - 找回密码信息
 * @param {string} data.email - 邮箱
 * @returns {Promise} 发送结果
 */
export function forgotPasswordSms(data) {
  // OpenAPI: POST /smsExchangePassword
  return request('/smsExchangePassword', {
    method: 'POST',
    data
  });
}

export function forgotPasswordEmail(data) {
  // OpenAPI: POST /emailExchangePassword
  return request('/emailExchangePassword', {
    method: 'POST',
    data
  });
}

/**
 * 获取用户信息
 * @returns {Promise} 用户信息
 */
export function getUserInfo() {
  // OpenAPI: GET /app/user/details
  return request('/app/user/details', {
    method: 'GET'
  });
}

/**
 * 更新用户信息
 * @param {Object} data - 用户信息
 * @returns {Promise} 更新结果
 */
export function updateUserInfo(data) {
  // OpenAPI: POST /app/user/updateInfo
  return request('/app/user/updateInfo', {
    method: 'POST',
    data
  });
}

/**
 * 修改密码
 * @param {Object} data - 密码信息
 * @param {string} data.oldPassword - 旧密码
 * @param {string} data.newPassword - 新密码
 * @returns {Promise} 修改结果
 */
export function changePassword(data) {
  // OpenAPI: POST /replacePassword
  return request('/replacePassword', {
    method: 'POST',
    data
  });
}

/**
 * 微信登录
 * @param {string} code - 微信授权码
 * @returns {Promise} 登录结果
 */
export function wechatLogin(openId, headImg = '', nickname = '') {
  // OpenAPI: POST /wechatLogin  body: AppThirdLoginBody
  return request('/wechatLogin', {
    method: 'POST',
    data: { openId, headImg, nickname }
  });
}

/**
 * 微信登录统一流程（多端）
 * - 小程序：使用 code 作为临时 openId 传给后端（由后端换取 openId/token）
 * - App/H5：尝试通过 provider 获取 openId
 */
export async function handleWechatLogin() {
  try {
    uni.showLoading({ title: '登录中...', mask: true });
    let openId = '';

    // #ifdef MP-WEIXIN
    const mpRes = await new Promise((resolve, reject) => {
      uni.login({ provider: 'weixin', success: resolve, fail: reject });
    });
    const code = mpRes?.code;
    openId = code || '';
    // #endif

    // #ifdef APP-PLUS
    if (!openId) {
      const appRes = await new Promise((resolve, reject) => {
        uni.login({ provider: 'weixin', success: resolve, fail: reject });
      });
      openId = appRes?.authResult?.openid || appRes?.authResult?.openId || '';
    }
    // #endif

    // #ifdef H5
    // H5 需集成微信 JS-SDK 获取 openid，这里暂不直接拉起授权
    // 若后续前端可拿到 openId，可在调用此方法前写入到本地再取用
    if (!openId) {
      const stored = uni.getStorageSync('wx_openid');
      if (stored) openId = stored;
    }
    // #endif

    if (!openId) {
      throw new Error('未获取到openId');
    }

    const resp = await wechatLogin(openId);
    const userInfo = resp?.data || {};
    const token = userInfo?.token;
    if (token) {
      uni.setStorageSync('token', token);
    }
    uni.setStorageSync('userInfo', userInfo);
    uni.setStorageSync('isLogin', true);
    return resp;
  } finally {
    uni.hideLoading();
  }
}

/**
 * 统一的登录处理函数
 * @param {Object} loginData - 登录数据
 * @param {boolean} rememberPassword - 是否记住密码
 */
export async function handleLoginProcess(loginData, rememberPassword = false) {
  try {
    // 调用登录API
    const response = await login(loginData);
    
    // 登录成功后处理
    // OpenAPI 统一返回: { code,msg,data }，用户信息中包含 token
    const userInfo = response.data;
    const token = response.data?.token;
    
    // 保存token和用户信息到本地存储
    uni.setStorageSync('token', token);
    uni.setStorageSync('userInfo', userInfo);
    uni.setStorageSync('isLogin', true);
    
    // 如果选择了记住密码，可以将用户名保存到本地
    if (rememberPassword) {
      setStorage('rememberedUsername', loginData.username);
      // 注意：实际项目中密码不应该明文存储，这里仅作演示
      // 如果需要记住密码功能，请考虑使用加密存储
    } else {
      // 清除之前存储的记住密码信息
      setStorage('rememberedUsername', '');
    }
    
    return response;
  } catch (error) {
    console.error('登录失败:', error);
    throw error;
  }
}

/**
 * 退出登录
 */
export function logout() {
  return request('/logout', {
    method: 'POST'
  }).finally(() => {
    // 清除本地存储的用户信息
    uni.removeStorageSync('token');
    uni.removeStorageSync('userInfo');
    uni.removeStorageSync('isLogin');
  });
}

/**
 * 检查用户登录状态
 * @returns {boolean} 是否已登录
 */
export function checkLoginStatus() {
  const token = uni.getStorageSync('token');
  return !!token;
}

// 首页仪表盘/目标/任务 - 占位，等待后端端点确认
export async function getUserDashboardData() {
  // 若后端暂未提供，先从用户详情中组装占位
  const res = await getUserInfo();
  return {
    points: 0,
    activeGoals: 0,
    todaysTasks: 0,
    user: res?.data || null
  };
}

export async function getUserGoals() {
  return {
    goals: []
  };
}

export async function getUserTodayTasks() {
  return {
    tasks: []
  };
}

export default {
  login,
  register,
  forgotPasswordSms,
  forgotPasswordEmail,
  getUserInfo,
  updateUserInfo,
  changePassword,
  wechatLogin,
  handleWechatLogin,
  handleLoginProcess,
  logout,
  checkLoginStatus,
  getUserDashboardData,
  getUserGoals,
  getUserTodayTasks
};